package Heroes;

import java.util.AbstractSequentialList;
import java.util.Iterator;
import java.util.LinkedList;

import Disparos.Disparo;
import Interfaz.RepresentacionGrafica;
import Interfaz.Reproductor;
import Juego.Tablero;




	public abstract class Heroe extends Thread{
		
		protected String nombre;
		protected int vida;
		protected int velocidad;
		protected int ataque;
		protected int fila;
		protected int columna;
		protected Tablero tablero;
		protected int puntosdeValor;
		protected Disparo d;
		protected RepresentacionGrafica component;
		protected Reproductor rep;
		protected int posicion;
		protected boolean stop=false;
		protected int altura;

		
		/**
		 * Constructor de la clase
		 * @param n Nombre del heroe
		 * @param v Vida del heroe
		 * @param ve Velocidad del heroe
		 * @param ata Ataque del heroe
		 * @param t Tablero
		 * @param val Puntos de valor del heroe
		 */
		
		protected Heroe(String n, int v, int ve, int ata,Tablero t, int val)
		{
			nombre=n;
			vida=v;
			velocidad=ve;
			ataque=ata;
			tablero=t;
			puntosdeValor=val;
			rep=new Reproductor();
			
		}

		/**
		 * Reduce la vida del heroe
		 * @param ataque vida a reducir
		 */
		public void reducirVida(int ataque) {
			vida-=ataque;
			
		}

		/**
		 * Retorna la vida del heroe
		 * @return vida del heroe
		 */
		public int getVida() {
			// TODO Auto-generated method stub
			return vida;
		}

		/**
		 * Elimina al heroe del juego
		 */
		public void eliminar() {
			
			if (vida<=0){
			component.setMuerto();
			try {
				Thread.sleep(1500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			}
			if (d!=null){
				d.getRepresentacion().setVisible(false);
				tablero.getPanel().remove(d.getRepresentacion());}
			vida=0;
			component.setVisible(false);
			tablero.getPanel().remove(component);
			tablero.getFilaHeroes(fila)[columna].setHeroe(null);
		

		}
		/**
		 * Permite obtener la representacion
		 * @return Representacion grafica
		 */
		public RepresentacionGrafica getRepresentacion() {
			// TODO Auto-generated method stub
			return component;
		}
		
		
		/**
		 * Permite setear la fila del heroe
		 * @param f fila del heroe
		 */
		public void setFila(int f){
			fila=f;
		}
		
		/**
		 * Permite setear la columna del heroe
		 * @param c columna del heroe
		 */
		public void setColumna(int c){
			columna=c;
		}
		/**
		 * Devuelve el costo del heroe
		 * @return Costo del heroe
		 */
		public int getCosto(){
			return puntosdeValor;
		}
		
		
		/**
		 * Devuelve posicion en x del heroe
		 * @return posicion en x del heroe
		 */
		public int getPosicion() {
			return posicion;
		}
	
		
		/**
		 * Accion a realizar por el heroe
		 */
		protected abstract void accion();
		
		
		/**
		 * Setea la posicion en x
		 * @param p posicion en x
		 */
		public void setPosicion(int p){
			posicion=p;
			
		}
		/**
		 * Setea la posicion en y
		 * @param a posicion en y
		 */
		public void setAltura(int a){
			altura=a;
		}
		
		/**
		 * Permite clonar al heroe
		 * @return Heroe
		 */
		public abstract Heroe clonar();

		
		/**
		 * Permite obtener el nombre del heroe
		 * @return nombre del heroe
		 */
		public String getNombre() {
			return nombre;
		}
		
		/**
		 * Setea stop con valor b
		 * @param b Nuevo valor de stop
		 */
		public void setStop(boolean b) {
			stop=b;
			
		}
		
		/**
		 * Metodo run de Thread
		 */
		public void run()
		{
			
			
			component.setLocation(posicion, altura);
			while ((tablero.getVida()>=0) && vida>0 && !stop)
			{
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				accion();
				
				}
			}
		

	
}
